home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 106_01 / machine.asm < prev    next >
Assembly Source File  |  1980-07-08  |  4KB  |  248 lines

  1. ;                machine.asm
  2. ;
  3. ;    Copyright (C) 1980, M J Maney
  4. ;
  5. ;    First created 8/28/80
  6. ;    Last revised 8/29/80 15:30
  7. ;
  8. ;    Tested and installed 8/29/80 16:15
  9. ;
  10. ;    This file contains some assembler functions for BDS C. These functions
  11. ;    are assorted little ditties for doing low-level operations such as
  12. ;    filling/moving/exchanging blocks of memory.
  13. ;
  14.     maclib    crl
  15. ;
  16. ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  17. ;
  18. ;    movmem        xchmem        fillbyte    fillword
  19. ;    inp        outp        peek        poke
  20. ;    peekw        pokew
  21. ;
  22. ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  23. ;
  24. ;
  25. ;    movmem(src,des,n)
  26. ;    char *src,*des;
  27. ;    uint n;
  28. ;
  29. ;    Move a block of memory from src to des: the block is n bytes long.
  30. ;    This function allows for moves of overlapping blocks by moving in
  31. ;    either ascending or descending order as required.
  32. ;
  33.     PROC    MOVMEM
  34.     lhld    ARG3
  35.     mov    b,h
  36.     mov    c,l        ;n to BC
  37.     lhld    ARG2
  38.     xchg            ;des to DE
  39.     lhld    ARG1        ;src to HL
  40.     BSR    movmem4        ;test for direction to use in moving
  41.     BC    movmem2
  42. movmem1    ;want to move from bottom to top
  43.     mov    a,b
  44.     ora    c        ;while (n > 0) {
  45.     rz
  46.     mov    a,m
  47.     inx    h
  48.     stax    d
  49.     inx    d        ;    *des++ = *src++;
  50.     dcx    b        ;    n--;
  51.     BRA    movmem1        ;    }
  52.                 ;return
  53. movmem2    ;want to move from top to bottom
  54.     dad    b        ;    des += n;
  55.     xchg
  56.     dad    b
  57.     xchg            ;    src += n;
  58. movmem3    mov    a,b
  59.     ora    c        ;while (n > 0) {
  60.     rz
  61.     dcx    h
  62.     mov    a,m
  63.     dcx    d
  64.     stax    d        ;    *--des = *--src;
  65.     dcx    b        ;    n--;
  66.     BRA    movmem3        ;    }
  67.                 ;return
  68. movmem4    ;a little internal subroutine
  69.     mov    a,h
  70.     cmp    d
  71.     rc
  72.     mov    a,l
  73.     cmp    e
  74.     ret
  75.     PEND    MOVMEM
  76. ;
  77. ;
  78. ;    xchmem(src,des,n)
  79. ;    char *src,*des;
  80. ;    uint n;
  81. ;
  82. ;    Exchange the contents of two blocks of memory. NO special checks
  83. ;    are done for overlapping blocks, so the result in such a case may
  84. ;    be sort of strange. However, xchmem is very careful to handle a
  85. ;    count of zero properly.
  86. ;
  87.     PROC    XCHMEM
  88.     lhld    ARG3
  89.     mov    b,h
  90.     mov    c,l        ;n to BC
  91.     lhld    ARG2
  92.     xchg            ;des to DE
  93.     lhld    ARG1        ;src to HL
  94. xchmem1    mov    a,b
  95.     ora    c        ;while (n > 0) {
  96.     rz
  97.     mov    a,m
  98.     push    psw        ;    temp=*src;
  99.     ldax    d
  100.     mov    m,a        ;    *src=*des;
  101.     pop    a
  102.     stax    d        ;    *des=temp;
  103.     inx    h        ;    src++;
  104.     inx    d        ;    des++;
  105.     dcx    b        ;    n--;
  106.     BRA    xchmem1        ;    }
  107.     PEND    XCHMEM
  108. ;
  109. ;
  110. ;    fillbyte(data,des,n)
  111. ;    char data,*des;
  112. ;    uint n;
  113. ;
  114. ;    Fill n bytes of memory, starting at des, with data. The case of
  115. ;    a zero count is properly handled.
  116. ;
  117.     PROC    FILLBYTE
  118.     lhld    ARG3
  119.     mov    b,h
  120.     mov    c,l        ;n to BC
  121.     lhld    ARG1
  122.     xchg            ;data to E
  123.     lhld    ARG2        ;des to HL
  124. fillb1    mov    a,b
  125.     ora    c        ;while (n > 0) {
  126.     rz
  127.     mov    m,e        ;    *des=data;
  128.     inx    h        ;    des++;
  129.     dcx    b        ;    n--;
  130.     BRA    fillb1        ;    }
  131.     PEND    FILLBYTE
  132. ;
  133. ;
  134. ;    fillword(data,des,n)
  135. ;    int data,*des;
  136. ;    uint n;
  137. ;
  138. ;    Fill n words of memory, starting at des, with data. Note that 2*n
  139. ;    bytes will be filled, and that the case n==0 is properly handled.
  140. ;
  141.     PROC    FILLWORD
  142.     lhld    ARG3
  143.     mov    b,h
  144.     mov    c,l        ;n to BC
  145.     lhld    ARG1
  146.     xchg            ;data to DE
  147.     lhld    ARG2        ;des to HL
  148. fillw1:    mov    a,b
  149.     ora    c        ;while (n > 0) {
  150.     rz
  151.     mov    m,e
  152.     inx    h
  153.     mov    m,d
  154.     inx    h        ;    *des++ = data;
  155.     dcx    b        ;    n--;
  156.     BRA    fillw1        ;    }
  157.     PEND    FILLWORD
  158. ;
  159. ;
  160. ;    inp(port)
  161. ;    char port;
  162. ;
  163. ;    Returns the value input from I/O port # port. Returned value
  164. ;    is an integer with high byte set to zero.
  165. ;
  166.     PROC    INP
  167.     lda    ARG1
  168.     STAR    inp1+1
  169. inp1:    in    0        ;second byte of op is dynamically set
  170.     mov    l,a
  171.     mvi    h,0
  172.     ret
  173.     PEND    INP
  174. ;
  175. ;
  176. ;    outp(data,port)
  177. ;    char data,port;
  178. ;
  179. ;    Data is output to hardware port # port.
  180. ;
  181.     PROC    OUTP
  182.     lda    ARG2
  183.     STAR    outp1+1
  184.     lda    ARG1
  185. outp1:    out    0        ;second byte of op is dynamically set
  186.     ret
  187.     PEND    OUTP
  188. ;
  189. ;
  190. ;    peek(adr)
  191. ;    char *adr;
  192. ;
  193. ;    Returns the char pointed to by adr.
  194. ;
  195.     PROC    PEEK
  196.     lhld    ARG1
  197.     mov    l,m
  198.     mvi    h,0
  199.     ret
  200.     PEND    PEEK
  201. ;
  202. ;
  203. ;    poke(data,adr)
  204. ;    char data,*adr;
  205. ;
  206. ;    Stores data into memory pointed to by adr.
  207. ;
  208.     PROC    POKE
  209.     lda    ARG1
  210.     lhld    ARG2
  211.     mov    m,a
  212.     ret
  213.     PEND    POKE
  214. ;
  215. ;
  216. ;    peekw(adr)
  217. ;    int *adr;
  218. ;
  219. ;    Returns the integer pointed to by adr.
  220. ;
  221.     PROC    PEEKW
  222.     lhld    ARG1
  223.     mov    a,m
  224.     inx    h
  225.     mov    h,m
  226.     mov    l,a
  227.     ret
  228.     PEND    PEEKW
  229. ;
  230. ;
  231. ;    pokew(data,adr)
  232. ;    int data,*adr;
  233. ;
  234. ;    Stores data into memory pointed to by adr.
  235. ;
  236.     PROC    POKEW
  237.     lhld    ARG1
  238.     xchg
  239.     lhld    ARG2
  240.     mov    m,e
  241.     inx    h
  242.     mov    m,d
  243.     ret
  244.     PEND    POKEW
  245. ;
  246. ;
  247.     end
  248.